{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deep Neural Network (DNN) \n",
    "\n",
    "### Regularization of DNN [256,256,256,256] with dropout"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Get the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored variables and their in-db values:\n",
      "X_32test_std              -> defaultdict(<class 'list'>, {0: array([[ 0.7957011\n",
      "X_32train_std             -> array([[-0.44445615,  0.62874736, -0.19049071, ...\n",
      "X_test                    -> defaultdict(<class 'list'>, {0: array([[[-0.004097\n",
      "X_test_std                -> defaultdict(<class 'list'>, {0: array([[ 0.8784659\n",
      "X_train                   -> array([[[-0.00304779,  0.0030504 , -0.00249425, ..\n",
      "X_train_std               -> array([[-0.44445615,  0.62874736, -0.19049071, ...\n",
      "snrs                      -> [-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, \n",
      "y_32_test                 -> defaultdict(<class 'list'>, {0: array([6, 7, 1, ..\n",
      "y_32_train                -> array([7, 2, 4, ..., 5, 5, 3])\n",
      "y_test                    -> defaultdict(<class 'list'>, {0: array([3, 2, 5, ..\n",
      "y_train                   -> array([7, 2, 4, ..., 5, 5, 3])\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from collections import defaultdict\n",
    "from time import time\n",
    "\n",
    "%store -r\n",
    "%store"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training data:  (80000, 32) and labels:  (80000,)\n",
      " \n",
      "Test data:\n",
      "Total 20 (4000, 32) arrays for SNR values:\n",
      "[-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n"
     ]
    }
   ],
   "source": [
    "print(\"Training data: \", X_32train_std.shape, \"and labels: \", y_32_train.shape)\n",
    "print(\" \")\n",
    "print(\"Test data:\")\n",
    "print(\"Total\", len(X_32test_std), X_32test_std[18].shape, \"arrays for SNR values:\")\n",
    "print(sorted(X_32test_std.keys()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# tf.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create validation set required for early stopping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation set data (40000, 32) and labels (40000,)\n"
     ]
    }
   ],
   "source": [
    "X_val = []\n",
    "y_val = []\n",
    "\n",
    "X_test_new = defaultdict(list)\n",
    "y_test_new = defaultdict(list)\n",
    "\n",
    "for snr in snrs:\n",
    "    n_test = X_32test_std[snr].shape[0]\n",
    "    X_val.append(X_32test_std[snr][:(n_test*0.5)])\n",
    "    y_val.append(y_32_test[snr][:(n_test*0.5)])\n",
    "    X_test_new[snr] = X_32test_std[snr][(n_test*0.5):]\n",
    "    y_test_new[snr] = y_32_test[snr][(n_test*0.5):]\n",
    "    \n",
    "X_val = np.vstack(np.asarray(X_val))\n",
    "y_val =np.hstack(np.asarray(y_val))\n",
    "\n",
    "print(\"Validation set data\", X_val.shape, \"and labels\", y_val.shape)\n",
    "\n",
    "X_32test_std = X_test_new\n",
    "y_32_test = y_test_new\n",
    "X_32_val = X_val \n",
    "y_32_val = y_val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Design and train the DNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\tValidation loss: 1.926688\tMinimum loss: 1.926688\tAccuracy on validation set: 0.31\n",
      "1\tValidation loss: 1.765679\tMinimum loss: 1.765679\tAccuracy on validation set: 0.35\n",
      "2\tValidation loss: 1.681601\tMinimum loss: 1.681601\tAccuracy on validation set: 0.37\n",
      "3\tValidation loss: 1.624947\tMinimum loss: 1.624947\tAccuracy on validation set: 0.39\n",
      "4\tValidation loss: 1.593946\tMinimum loss: 1.593946\tAccuracy on validation set: 0.40\n",
      "5\tValidation loss: 1.562054\tMinimum loss: 1.562054\tAccuracy on validation set: 0.41\n",
      "6\tValidation loss: 1.545653\tMinimum loss: 1.545653\tAccuracy on validation set: 0.42\n",
      "7\tValidation loss: 1.532913\tMinimum loss: 1.532913\tAccuracy on validation set: 0.42\n",
      "8\tValidation loss: 1.511541\tMinimum loss: 1.511541\tAccuracy on validation set: 0.42\n",
      "9\tValidation loss: 1.496170\tMinimum loss: 1.496170\tAccuracy on validation set: 0.44\n",
      "10\tValidation loss: 1.494951\tMinimum loss: 1.494951\tAccuracy on validation set: 0.43\n",
      "11\tValidation loss: 1.484785\tMinimum loss: 1.484785\tAccuracy on validation set: 0.44\n",
      "12\tValidation loss: 1.472076\tMinimum loss: 1.472076\tAccuracy on validation set: 0.44\n",
      "13\tValidation loss: 1.472951\tMinimum loss: 1.472076\tAccuracy on validation set: 0.44\n",
      "14\tValidation loss: 1.466610\tMinimum loss: 1.466610\tAccuracy on validation set: 0.44\n",
      "15\tValidation loss: 1.469692\tMinimum loss: 1.466610\tAccuracy on validation set: 0.45\n",
      "16\tValidation loss: 1.456868\tMinimum loss: 1.456868\tAccuracy on validation set: 0.44\n",
      "17\tValidation loss: 1.455477\tMinimum loss: 1.455477\tAccuracy on validation set: 0.45\n",
      "18\tValidation loss: 1.453045\tMinimum loss: 1.453045\tAccuracy on validation set: 0.45\n",
      "19\tValidation loss: 1.449007\tMinimum loss: 1.449007\tAccuracy on validation set: 0.45\n",
      "20\tValidation loss: 1.446539\tMinimum loss: 1.446539\tAccuracy on validation set: 0.45\n",
      "21\tValidation loss: 1.446489\tMinimum loss: 1.446489\tAccuracy on validation set: 0.45\n",
      "22\tValidation loss: 1.441313\tMinimum loss: 1.441313\tAccuracy on validation set: 0.45\n",
      "23\tValidation loss: 1.442097\tMinimum loss: 1.441313\tAccuracy on validation set: 0.45\n",
      "24\tValidation loss: 1.436289\tMinimum loss: 1.436289\tAccuracy on validation set: 0.45\n",
      "25\tValidation loss: 1.434881\tMinimum loss: 1.434881\tAccuracy on validation set: 0.45\n",
      "26\tValidation loss: 1.426188\tMinimum loss: 1.426188\tAccuracy on validation set: 0.46\n",
      "27\tValidation loss: 1.422947\tMinimum loss: 1.422947\tAccuracy on validation set: 0.46\n",
      "28\tValidation loss: 1.419529\tMinimum loss: 1.419529\tAccuracy on validation set: 0.46\n",
      "29\tValidation loss: 1.412032\tMinimum loss: 1.412032\tAccuracy on validation set: 0.46\n",
      "30\tValidation loss: 1.408830\tMinimum loss: 1.408830\tAccuracy on validation set: 0.47\n",
      "31\tValidation loss: 1.397548\tMinimum loss: 1.397548\tAccuracy on validation set: 0.47\n",
      "32\tValidation loss: 1.386150\tMinimum loss: 1.386150\tAccuracy on validation set: 0.48\n",
      "33\tValidation loss: 1.377511\tMinimum loss: 1.377511\tAccuracy on validation set: 0.48\n",
      "34\tValidation loss: 1.375236\tMinimum loss: 1.375236\tAccuracy on validation set: 0.49\n",
      "35\tValidation loss: 1.373622\tMinimum loss: 1.373622\tAccuracy on validation set: 0.49\n",
      "36\tValidation loss: 1.362659\tMinimum loss: 1.362659\tAccuracy on validation set: 0.49\n",
      "37\tValidation loss: 1.362580\tMinimum loss: 1.362580\tAccuracy on validation set: 0.49\n",
      "38\tValidation loss: 1.359160\tMinimum loss: 1.359160\tAccuracy on validation set: 0.49\n",
      "39\tValidation loss: 1.363958\tMinimum loss: 1.359160\tAccuracy on validation set: 0.49\n",
      "40\tValidation loss: 1.354600\tMinimum loss: 1.354600\tAccuracy on validation set: 0.50\n",
      "41\tValidation loss: 1.356718\tMinimum loss: 1.354600\tAccuracy on validation set: 0.50\n",
      "42\tValidation loss: 1.354674\tMinimum loss: 1.354600\tAccuracy on validation set: 0.49\n",
      "43\tValidation loss: 1.351590\tMinimum loss: 1.351590\tAccuracy on validation set: 0.49\n",
      "44\tValidation loss: 1.348212\tMinimum loss: 1.348212\tAccuracy on validation set: 0.50\n",
      "45\tValidation loss: 1.344576\tMinimum loss: 1.344576\tAccuracy on validation set: 0.50\n",
      "46\tValidation loss: 1.347653\tMinimum loss: 1.344576\tAccuracy on validation set: 0.50\n",
      "47\tValidation loss: 1.343476\tMinimum loss: 1.343476\tAccuracy on validation set: 0.50\n",
      "48\tValidation loss: 1.347700\tMinimum loss: 1.343476\tAccuracy on validation set: 0.50\n",
      "49\tValidation loss: 1.340998\tMinimum loss: 1.340998\tAccuracy on validation set: 0.50\n",
      "50\tValidation loss: 1.336973\tMinimum loss: 1.336973\tAccuracy on validation set: 0.50\n",
      "51\tValidation loss: 1.333793\tMinimum loss: 1.333793\tAccuracy on validation set: 0.50\n",
      "52\tValidation loss: 1.342954\tMinimum loss: 1.333793\tAccuracy on validation set: 0.50\n",
      "53\tValidation loss: 1.341732\tMinimum loss: 1.333793\tAccuracy on validation set: 0.50\n",
      "54\tValidation loss: 1.335071\tMinimum loss: 1.333793\tAccuracy on validation set: 0.50\n",
      "55\tValidation loss: 1.332924\tMinimum loss: 1.332924\tAccuracy on validation set: 0.50\n",
      "56\tValidation loss: 1.334290\tMinimum loss: 1.332924\tAccuracy on validation set: 0.50\n",
      "57\tValidation loss: 1.331084\tMinimum loss: 1.331084\tAccuracy on validation set: 0.50\n",
      "58\tValidation loss: 1.334263\tMinimum loss: 1.331084\tAccuracy on validation set: 0.51\n",
      "59\tValidation loss: 1.332800\tMinimum loss: 1.331084\tAccuracy on validation set: 0.50\n",
      "60\tValidation loss: 1.334180\tMinimum loss: 1.331084\tAccuracy on validation set: 0.50\n",
      "61\tValidation loss: 1.330663\tMinimum loss: 1.330663\tAccuracy on validation set: 0.50\n",
      "62\tValidation loss: 1.335254\tMinimum loss: 1.330663\tAccuracy on validation set: 0.50\n",
      "63\tValidation loss: 1.327970\tMinimum loss: 1.327970\tAccuracy on validation set: 0.51\n",
      "64\tValidation loss: 1.330128\tMinimum loss: 1.327970\tAccuracy on validation set: 0.50\n",
      "65\tValidation loss: 1.335071\tMinimum loss: 1.327970\tAccuracy on validation set: 0.50\n",
      "66\tValidation loss: 1.330553\tMinimum loss: 1.327970\tAccuracy on validation set: 0.50\n",
      "67\tValidation loss: 1.331963\tMinimum loss: 1.327970\tAccuracy on validation set: 0.51\n",
      "68\tValidation loss: 1.332028\tMinimum loss: 1.327970\tAccuracy on validation set: 0.50\n",
      "69\tValidation loss: 1.330746\tMinimum loss: 1.327970\tAccuracy on validation set: 0.50\n",
      "70\tValidation loss: 1.329520\tMinimum loss: 1.327970\tAccuracy on validation set: 0.51\n",
      "71\tValidation loss: 1.327605\tMinimum loss: 1.327605\tAccuracy on validation set: 0.50\n",
      "72\tValidation loss: 1.328805\tMinimum loss: 1.327605\tAccuracy on validation set: 0.50\n",
      "73\tValidation loss: 1.322764\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "74\tValidation loss: 1.332068\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "75\tValidation loss: 1.327324\tMinimum loss: 1.322764\tAccuracy on validation set: 0.51\n",
      "76\tValidation loss: 1.328546\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "77\tValidation loss: 1.335115\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "78\tValidation loss: 1.329519\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "79\tValidation loss: 1.326997\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "80\tValidation loss: 1.335276\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "81\tValidation loss: 1.331623\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "82\tValidation loss: 1.325446\tMinimum loss: 1.322764\tAccuracy on validation set: 0.50\n",
      "83\tValidation loss: 1.328340\tMinimum loss: 1.322764\tAccuracy on validation set: 0.51\n",
      "84\tValidation loss: 1.325637\tMinimum loss: 1.322764\tAccuracy on validation set: 0.51\n",
      "85\tValidation loss: 1.321337\tMinimum loss: 1.321337\tAccuracy on validation set: 0.50\n",
      "86\tValidation loss: 1.326633\tMinimum loss: 1.321337\tAccuracy on validation set: 0.50\n",
      "87\tValidation loss: 1.323237\tMinimum loss: 1.321337\tAccuracy on validation set: 0.50\n",
      "88\tValidation loss: 1.324215\tMinimum loss: 1.321337\tAccuracy on validation set: 0.51\n",
      "89\tValidation loss: 1.324814\tMinimum loss: 1.321337\tAccuracy on validation set: 0.50\n",
      "90\tValidation loss: 1.324576\tMinimum loss: 1.321337\tAccuracy on validation set: 0.51\n",
      "91\tValidation loss: 1.325631\tMinimum loss: 1.321337\tAccuracy on validation set: 0.51\n",
      "92\tValidation loss: 1.322858\tMinimum loss: 1.321337\tAccuracy on validation set: 0.51\n",
      "93\tValidation loss: 1.323815\tMinimum loss: 1.321337\tAccuracy on validation set: 0.51\n",
      "94\tValidation loss: 1.318568\tMinimum loss: 1.318568\tAccuracy on validation set: 0.50\n",
      "95\tValidation loss: 1.328219\tMinimum loss: 1.318568\tAccuracy on validation set: 0.51\n",
      "96\tValidation loss: 1.325547\tMinimum loss: 1.318568\tAccuracy on validation set: 0.51\n",
      "97\tValidation loss: 1.338207\tMinimum loss: 1.318568\tAccuracy on validation set: 0.51\n",
      "98\tValidation loss: 1.320582\tMinimum loss: 1.318568\tAccuracy on validation set: 0.50\n",
      "99\tValidation loss: 1.332442\tMinimum loss: 1.318568\tAccuracy on validation set: 0.51\n",
      "100\tValidation loss: 1.323699\tMinimum loss: 1.318568\tAccuracy on validation set: 0.51\n",
      "101\tValidation loss: 1.320344\tMinimum loss: 1.318568\tAccuracy on validation set: 0.50\n",
      "102\tValidation loss: 1.317986\tMinimum loss: 1.317986\tAccuracy on validation set: 0.51\n",
      "103\tValidation loss: 1.327401\tMinimum loss: 1.317986\tAccuracy on validation set: 0.51\n",
      "104\tValidation loss: 1.322752\tMinimum loss: 1.317986\tAccuracy on validation set: 0.50\n",
      "105\tValidation loss: 1.315414\tMinimum loss: 1.315414\tAccuracy on validation set: 0.51\n",
      "106\tValidation loss: 1.313787\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "107\tValidation loss: 1.320422\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "108\tValidation loss: 1.319037\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "109\tValidation loss: 1.318763\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "110\tValidation loss: 1.320737\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "111\tValidation loss: 1.315852\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "112\tValidation loss: 1.323696\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "113\tValidation loss: 1.317495\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "114\tValidation loss: 1.317013\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "115\tValidation loss: 1.314170\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "116\tValidation loss: 1.322122\tMinimum loss: 1.313787\tAccuracy on validation set: 0.50\n",
      "117\tValidation loss: 1.316306\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "118\tValidation loss: 1.315748\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "119\tValidation loss: 1.314674\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "120\tValidation loss: 1.319675\tMinimum loss: 1.313787\tAccuracy on validation set: 0.51\n",
      "121\tValidation loss: 1.312023\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "122\tValidation loss: 1.316986\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "123\tValidation loss: 1.317352\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "124\tValidation loss: 1.314571\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "125\tValidation loss: 1.316420\tMinimum loss: 1.312023\tAccuracy on validation set: 0.50\n",
      "126\tValidation loss: 1.322317\tMinimum loss: 1.312023\tAccuracy on validation set: 0.50\n",
      "127\tValidation loss: 1.315598\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "128\tValidation loss: 1.314658\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "129\tValidation loss: 1.318504\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "130\tValidation loss: 1.313396\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "131\tValidation loss: 1.318622\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "132\tValidation loss: 1.314840\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "133\tValidation loss: 1.315456\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "134\tValidation loss: 1.313510\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "135\tValidation loss: 1.326876\tMinimum loss: 1.312023\tAccuracy on validation set: 0.50\n",
      "136\tValidation loss: 1.313114\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "137\tValidation loss: 1.315197\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "138\tValidation loss: 1.315933\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "139\tValidation loss: 1.322107\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "140\tValidation loss: 1.317009\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "141\tValidation loss: 1.315114\tMinimum loss: 1.312023\tAccuracy on validation set: 0.51\n",
      "142\tValidation loss: 1.311431\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "143\tValidation loss: 1.317702\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "144\tValidation loss: 1.317210\tMinimum loss: 1.311431\tAccuracy on validation set: 0.50\n",
      "145\tValidation loss: 1.321571\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "146\tValidation loss: 1.315449\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "147\tValidation loss: 1.316181\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "148\tValidation loss: 1.315755\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "149\tValidation loss: 1.314485\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "150\tValidation loss: 1.313509\tMinimum loss: 1.311431\tAccuracy on validation set: 0.51\n",
      "151\tValidation loss: 1.310007\tMinimum loss: 1.310007\tAccuracy on validation set: 0.51\n",
      "152\tValidation loss: 1.312118\tMinimum loss: 1.310007\tAccuracy on validation set: 0.51\n",
      "153\tValidation loss: 1.318390\tMinimum loss: 1.310007\tAccuracy on validation set: 0.51\n",
      "154\tValidation loss: 1.309220\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "155\tValidation loss: 1.311982\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "156\tValidation loss: 1.317495\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "157\tValidation loss: 1.322397\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "158\tValidation loss: 1.318708\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "159\tValidation loss: 1.319420\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "160\tValidation loss: 1.315804\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "161\tValidation loss: 1.317925\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "162\tValidation loss: 1.314339\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "163\tValidation loss: 1.319353\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "164\tValidation loss: 1.320590\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "165\tValidation loss: 1.323077\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "166\tValidation loss: 1.315239\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "167\tValidation loss: 1.312571\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "168\tValidation loss: 1.313836\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "169\tValidation loss: 1.314455\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "170\tValidation loss: 1.319464\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "171\tValidation loss: 1.319696\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "172\tValidation loss: 1.312072\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "173\tValidation loss: 1.316447\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "174\tValidation loss: 1.314911\tMinimum loss: 1.309220\tAccuracy on validation set: 0.51\n",
      "** EARLY STOPPING ** \n",
      " \n",
      "INFO:tensorflow:Restoring parameters from ./DNN4layer_regtech_dropout\n",
      "Training and testing took 11.718560 minutes\n"
     ]
    }
   ],
   "source": [
    "# ----------------- Initialize parameters -----------------------\n",
    "\n",
    "\n",
    "n_hidden1 = 256\n",
    "n_hidden2 = 256\n",
    "n_hidden3 = 256\n",
    "n_hidden4 = 256\n",
    "\n",
    "drop_rate = 0.25\n",
    "n_outputs = 8\n",
    "\n",
    "dropout_rate = 0.25\n",
    "\n",
    "X = tf.placeholder(tf.float32, shape=(None, 32))\n",
    "y = tf.placeholder(tf.int64, shape=(None))\n",
    "training_ = tf.placeholder_with_default(False, shape=[])\n",
    "\n",
    "# ------------------- Define layers -----------------------\n",
    "\n",
    "from tensorflow.contrib.layers import fully_connected\n",
    "\n",
    "def layer(X, n_neurons, activation):\n",
    "    layer = fully_connected(X, n_neurons, activation_fn = activation, \n",
    "                            weights_initializer = tf.contrib.layers.variance_scaling_initializer())\n",
    "    layer_drop = tf.layers.dropout(layer, dropout_rate, training = training_)\n",
    "    return layer_drop\n",
    "\n",
    "layer1 = layer(X, n_hidden1, activation = tf.nn.elu)\n",
    "\n",
    "layer2 = layer(layer1, n_hidden2, activation = tf.nn.elu)\n",
    "\n",
    "layer3 = layer(layer2, n_hidden3, activation = tf.nn.elu)\n",
    "\n",
    "layer4 = layer(layer3, n_hidden4, activation = tf.nn.elu)\n",
    "\n",
    "logits = layer(layer4, n_outputs, activation = None)\n",
    "\n",
    "# ----------------- Specify performance measure ----------------------\n",
    "\n",
    "xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)\n",
    "loss = tf.reduce_mean(xentropy)\n",
    "\n",
    "optimizer = tf.train.AdamOptimizer()\n",
    "training_op = optimizer.minimize(loss)\n",
    "\n",
    "correct = tf.nn.in_top_k(logits, y, 1)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
    "        \n",
    "# ------------------ Execution phase ----------------------------------    \n",
    "\n",
    "n_epochs = 1000\n",
    "batch_size = 1024\n",
    "n_train = X_train_std.shape[0]\n",
    "n_iter = n_train//batch_size\n",
    "\n",
    "saver = tf.train.Saver()\n",
    "\n",
    "min_loss = np.infty\n",
    "epochs_without_improvement = 0 \n",
    "max_epochs_without_improvement = 20   \n",
    "\n",
    "acc_test = defaultdict(list)\n",
    "\n",
    "start = time()\n",
    "path = \"./DNN4layer_regtech_dropout\"\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    tf.global_variables_initializer().run()\n",
    "    for epoch in range(n_epochs):\n",
    "        for iteration in range(n_iter):\n",
    "            rand_indices = np.random.choice(n_train,batch_size) #select random samples to form mini batches   \n",
    "            X_batch, y_batch = X_32train_std[rand_indices], y_32_train[rand_indices]\n",
    "            sess.run(training_op, feed_dict={X: X_batch, y: y_batch,  training_: True})\n",
    "        valid_loss, acc_val = sess.run([loss, accuracy], feed_dict={X: X_32_val, y: y_32_val, training_: True})\n",
    "        \n",
    "        # Early stopping \n",
    "        \n",
    "        if valid_loss < min_loss:\n",
    "            save_path = saver.save(sess, path)\n",
    "            min_loss = valid_loss\n",
    "            epochs_without_improvement = 0\n",
    "        else:\n",
    "            epochs_without_improvement += 1\n",
    "            if epochs_without_improvement > max_epochs_without_improvement:\n",
    "                print(\"** EARLY STOPPING ** \")\n",
    "                break\n",
    "        print(\"{}\\tValidation loss: {:.6f}\\tMinimum loss: {:.6f}\\tAccuracy on validation set: {:.2f}\".format(\n",
    "            epoch, valid_loss, min_loss, acc_val))\n",
    "\n",
    "print(\" \")\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, path)\n",
    "    for snr in snrs:\n",
    "        acc_test[snr] = accuracy.eval(feed_dict={X: X_32test_std[snr], y: y_32_test[snr]})\n",
    "\n",
    "print(\"Training and testing took %f minutes\"%(float(time() - start)/60))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test the DNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DNN's test accuracy on -20 dB SNR samples =  0.1315\n",
      "DNN's test accuracy on -18 dB SNR samples =  0.134\n",
      "DNN's test accuracy on -16 dB SNR samples =  0.13\n",
      "DNN's test accuracy on -14 dB SNR samples =  0.136\n",
      "DNN's test accuracy on -12 dB SNR samples =  0.134\n",
      "DNN's test accuracy on -10 dB SNR samples =  0.1715\n",
      "DNN's test accuracy on -8 dB SNR samples =  0.2925\n",
      "DNN's test accuracy on -6 dB SNR samples =  0.3915\n",
      "DNN's test accuracy on -4 dB SNR samples =  0.426\n",
      "DNN's test accuracy on -2 dB SNR samples =  0.482\n",
      "DNN's test accuracy on 0 dB SNR samples =  0.578\n",
      "DNN's test accuracy on 2 dB SNR samples =  0.7075\n",
      "DNN's test accuracy on 4 dB SNR samples =  0.819\n",
      "DNN's test accuracy on 6 dB SNR samples =  0.832\n",
      "DNN's test accuracy on 8 dB SNR samples =  0.844\n",
      "DNN's test accuracy on 10 dB SNR samples =  0.838\n",
      "DNN's test accuracy on 12 dB SNR samples =  0.8305\n",
      "DNN's test accuracy on 14 dB SNR samples =  0.8405\n",
      "DNN's test accuracy on 16 dB SNR samples =  0.841\n",
      "DNN's test accuracy on 18 dB SNR samples =  0.847\n"
     ]
    }
   ],
   "source": [
    "for snr in snrs:\n",
    "    print(\"DNN's test accuracy on %d dB SNR samples = \"%(snr), acc_test[snr])   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "##  Visualize DNN's performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nTE1NDQDV1dWMHTt2w3OmOt/kTG2/9NJLGT2f8sKdp21tF8L26V8eRzTm/P3vTxfEeLS9ddudlFcc\neZ3f19fX05tc94xFgLeAw4EPgBeAie4+P+GYPwD3ufsdZrYH8Bd33z7JudQzJiIiIkWhYG5t4e5R\n4CzgCeB14F53n29mc8zsmPhh04HTzewl4G7g1FyOUURERCSXclqMAbj74+6+m7t/zN0vj++70N0f\ni38/390Pcfex7r6fu/8t12NMpuu0pvKUVwhZylNep2jUWb0umrO8dCmvOLOUl1s5L8ZERCTzbnt0\nNVN++iGvvtOS76GIyGbS45BERIrcC683c/6NyykzuObckeyza998D0lEuiiYnjEREcms5Y0dXHZH\ncD+xU48ZrEJMpAipGEtT2NeylVecWcor7bxo1PnpbStYvS7G/rv35aTxg7KatyWUV5xZysstFWMi\nIkXqxbdaeOWdVoYOKuOHk4cRKUu6AiIiBU49YyIiRexfrzfTt8K0PClS4FL1jKkYExEREckyNfBn\nQNjXspVXnFnKU57ySicvzNdWCnmpqBgTERERySMtU4qIFImXFrRQVgZ776L+MJFio2VKEZEit3J1\nlItva+C8ny3jFd1lXyRUVIylKexr2corzizllUZeNOb89PYGVq2JsffH+rDnTn2ympdJyivOLOXl\nlooxEZECd/fja/jvW60MGVjGj741XPcTEwkZ9YyJiBSw/77Vwg+uX4YDV5w1gk/u0S/fQxKRLZCq\nZ6w814MREZH0RWPOgKoyjj10gAoxkZDSMmWawr6WrbzizFJe+PM+uUc/bp29Lad+cXBO8jJNecWZ\npbzc0syYiEiBGzY4ku8hiEgWqWdMREREJMt0nzERkSIRi+kfmSKlRsVYmsK+lq284sxSXrjyYjHn\nR79azu8eX521oqyU3s+w5YX52kohLxUVYyIiBeLeJ9bwr9dbuO9va2lcF8v3cEQkR9QzJiJSAF59\np4XvXbeMWAwumzaCg/bUbSxEwkQ9YyIiBWz1uigX37aCWAxOPHKQCjGREqNiLE1hX8tWXnFmKS8c\neTf+fhUNjVH23KmSb38pM/cTS5WXS8orzizl5ZbuMyYikgd1dfVcevUtzH/rXXaq3Yk9dzyeC769\nD+URPXdSpNTkvGfMzCYA1xHMyt3q7ld0ef1a4POAA/2BEe4+NMl51DMmIkWprq6eiVOvpE/NOUQq\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0c5cae22e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('classic')\n",
    "%matplotlib inline\n",
    "\n",
    "acc_test = sorted(acc_test.items())\n",
    "new_acc = []\n",
    "for i in range(len(acc_test)):\n",
    "    new_acc.append(acc_test[i][1])\n",
    "acc_test_values = new_acc \n",
    "\n",
    "fig1 = plt.figure(figsize=(10, 6), dpi=100)\n",
    "x = snrs\n",
    "y = list(acc_test_values)\n",
    "plt.plot(x, y, marker=\"o\", linewidth=2.0, linestyle='dashed', color='royalblue')\n",
    "plt.axis([-20, 20, 0, 1])\n",
    "plt.xticks(np.arange(min(x), max(x)+1, 2.0))\n",
    "plt.yticks(np.arange(0, 1, 0.10))\n",
    "\n",
    "ttl = plt.title('SNR vs Accuracy', fontsize=16)\n",
    "ttl.set_weight('bold')\n",
    "plt.xlabel('SNR (dB)', fontsize=14)\n",
    "plt.ylabel('Test accuracy', fontsize=14)\n",
    "plt.grid()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./DNN4layer_regtech_dropout\n",
      "Confusion Matrix\n",
      "       8PSK  BPSK  CPFSK  GFSK  PAM4  QAM16  QAM64  QPSK\n",
      "8PSK   0.82  0.00   0.00  0.00  0.01   0.08   0.08  0.00\n",
      "BPSK   0.00  0.97   0.00  0.00  0.01   0.00   0.01  0.00\n",
      "CPFSK  0.01  0.00   0.97  0.00  0.00   0.01   0.01  0.00\n",
      "GFSK   0.01  0.00   0.00  0.97  0.00   0.01   0.01  0.00\n",
      "PAM4   0.00  0.00   0.00  0.00  0.99   0.01   0.00  0.00\n",
      "QAM16  0.07  0.00   0.00  0.00  0.00   0.54   0.39  0.00\n",
      "QAM64  0.01  0.00   0.00  0.00  0.00   0.47   0.52  0.00\n",
      "QPSK   0.03  0.00   0.00  0.00  0.00   0.05   0.03  0.89\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0c40768940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Confusion Matrix\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, path)\n",
    "    Z = logits.eval(feed_dict = {X : X_32test_std[18]})\n",
    "    predicted_18dB = np.argmax(Z, axis = 1)\n",
    "    \n",
    "from sklearn.metrics import confusion_matrix\n",
    "%matplotlib inline\n",
    "\n",
    "classes = ['8PSK', 'BPSK', 'CPFSK', 'GFSK', 'PAM4', 'QAM16', 'QAM64', 'QPSK']\n",
    "conf_matrix = confusion_matrix(predicted_18dB, y_32_test[18])  \n",
    "\n",
    "conf_matrix = conf_matrix.astype('float') / conf_matrix.sum(axis=1)[:, np.newaxis]\n",
    "conf_matrix = conf_matrix.round(decimals = 2)\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "df = pd.DataFrame(data = conf_matrix, columns = classes, index = classes) \n",
    "print(\"Confusion Matrix\")\n",
    "print(df)\n",
    "\n",
    "fig1 = plt.figure(figsize=(10, 6), dpi=100)\n",
    "plt.imshow(conf_matrix, interpolation = 'nearest', cmap = plt.cm.Purples)\n",
    "ticks = np.arange(len(classes))\n",
    "plt.title(\"Confusion Matrix\")\n",
    "plt.xticks(ticks, classes, rotation=45)\n",
    "plt.yticks(ticks, classes)\n",
    "\n",
    "plt.ylabel('True class')\n",
    "plt.xlabel('Predicted class')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
